#include "baza/baza.h"

Baza::Baza(QObject *parent):QObject(parent){}

Baza::Baza(QString imeBaze) {
    if (otvoriBazu(imeBaze)){
        qDebug()<<"baza uspjesno otvorena "<<imeBaze;
    }
    else
        qDebug()<<"greska kod otvaranja baze "<<imeBaze;
}

Baza::~Baza(){}

bool Baza::otvoriBazu(QString imeBaze){
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName(imeBaze);

    if (!db.open())
        return false;

    qDebug() << "konekcija je uspjesno otvorena, zovem stvaranje tablica";
    return true;
}

bool Baza::query(QString sqlQuery){
    QSqlQuery query;

    query.prepare(sqlQuery);

    if (!query.exec()){
        qDebug()<<"greska kod izvrsavanja upita "<<sqlQuery;
        return false;
    }

    qDebug()<<"uspjesno izvrsen upit "<<sqlQuery;
    return true;
}


bool Baza::postojiTablica(QString imeTablice){
    QSqlQuery query;

    query.prepare("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=:imeTablice;");

    query.bindValue(":imeTablice", imeTablice);

    if (!query.exec())
        qDebug()<<"greska kod postojiTablica";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    int br=0;
    if (query.next()){

        br=query.value(0).toInt();
    }

    if (br!=0)
        return true;

    return false;

}

bool Baza::napraviTablice(){
    //   if (!postojiTablica("grupe")||!postojiTablica("artikli")||!postojiTablica("popisi")||!postojiTablica("lista")||!postojiTablica("jezici")){
    //       qDebug()<<"neka tablica ne postoji, radim nove.";

    //grupe
    if (!query("CREATE TABLE IF NOT EXISTS grupe (id INTEGER PRIMARY KEY, "\
               "imeGrupe TEXT, "\
               "prioritetGrupe INTEGER DEFAULT 0);"))
        return false;

    //artikli
    if (!query("CREATE TABLE IF NOT EXISTS artikli (id INTEGER PRIMARY KEY, "\
               "barKod TEXT, "\
               "imeArtikla TEXT, "\
               "idGrupe INTEGER DEFAULT 0);"))
        return false;

    //popisi
    if (!query("CREATE TABLE IF NOT EXISTS popisi (id INTEGER PRIMARY KEY, "\
               "imePopisa TEXT, "\
               "prioritetPopisa INTEGER DEFAULT 0);"))
        return false;

    //lista
    if (!query("CREATE TABLE IF NOT EXISTS lista (id INTEGER PRIMARY KEY, "\
               "idPopisa INTEGER, "\
               "idArtikla INTEGER, "\
               "kolicina REAL DEFAULT 1, "\
               "kupljeno INTEGER DEFAULT 0, "\
               "jedinica TEXT);"))
        return false;

    qDebug()<<"tablice uspjesno kreirane";

    return true;
}

int Baza::postojiPopis(QString imePopisa){
    QSqlQuery query;

    query.prepare("SELECT id FROM popisi WHERE imePopisa=:imePopisa;");
    query.bindValue(":imePopisa", imePopisa);

    if (!query.exec()){
        qDebug()<<"greska kod postojiPopis";
        return -1;
    }

    QSqlRecord record=query.record();

    if (query.next()){
        return query.value(record.indexOf("id")).toInt();
    }

    return -1;
}


bool Baza::jePrvoPokretanje(){
    /*query("DROP TABLE grupe;");
    query("DROP TABLE artikli;");
    query("DROP TABLE popisi;");
    query("DROP TABLE lista;");
    query("DROP TABLE jezici;");*/

    pripremiJezike();

    if (!postojiTablica("grupe")||!postojiTablica("artikli")||!postojiTablica("popisi")||!postojiTablica("lista")){
        qDebug()<<"neka tablica ne postoji, radim nove.";

        return true;
    }

    return false;
}

void Baza::pripremiJezike(){

    if (!postojiTablica("jezici")){

        stvoriTablicuJezici();

        ubaciSveJezike();
    }
    else if (dajBrojJezika()<16) //number of languages in version 2.0.6
    {
        Jezik trenutnoOdabraniJezik=dajOdabraniJezik();

        query("DROP TABLE jezici;"); //brisemo tablicu s jezicima

        stvoriTablicuJezici();

        ubaciSveJezike();

        odaberiJezik(trenutnoOdabraniJezik.dajId()); //odaberi stari odabrani jezik
    }

}

void Baza::stvoriTablicuJezici(){
    query("CREATE TABLE IF NOT EXISTS jezici (id INTEGER PRIMARY KEY, "\
          "imeJezika TEXT, "\
          "sifraJezika TEXT, "\
          "odabrano INTEGER DEFAULT 0"\
          ");");
}

void Baza::ubaciSveJezike(){
    //do not change the order of insertion

    //version 2.0
    query(QString::fromUtf8("insert into jezici values (null, 'English', 'English', 1);"));
    query(QString::fromUtf8("insert into jezici values (null, 'hrvatski', 'Croatian', 0);"));
    query(QString::fromUtf8("insert into jezici values (null, 'italiano', 'Italian', 0);"));

    //added in version 2.0.1
    query(QString::fromUtf8("insert into jezici values (null, 'Deutsch', 'German', 0);"));
    query(QString::fromUtf8("insert into jezici values (null, 'srpski', 'Serbian', 0);"));
    query(QString::fromUtf8("insert into jezici values (null, 'Türkçe', 'Turkish', 0);"));
    query(QString::fromUtf8("insert into jezici values (null, 'français', 'French', 0);"));
    query(QString::fromUtf8("insert into jezici values (null, 'беларуская мова', 'Belarusian', 0);"));
    query(QString::fromUtf8("insert into jezici values (null, 'português', 'Portuguese', 0);"));
    query(QString::fromUtf8("insert into jezici values (null, 'norsk', 'Norwegian', 0);"));

    //added in version 2.0.3
    query(QString::fromUtf8("insert into jezici values (null, 'русский', 'Russian', 0);"));
    query(QString::fromUtf8("insert into jezici values (null, 'українська мова', 'Ukrainian', 0);"));
    query(QString::fromUtf8("insert into jezici values (null, 'slovenčina', 'Slovak', 0);"));

    //added in version 2.0.4
    query(QString::fromUtf8("insert into jezici values (null, 'polski', 'Polish', 0);"));

    //added in version 2.0.5
    query(QString::fromUtf8("insert into jezici values (null, 'español', 'Spanish', 0);"));

    //added in version 2.0.6 //TODO add finnish
    query(QString::fromUtf8("insert into jezici values (null, 'العربية', 'Arabic', 0);"));

    //query(QString::fromUtf8("insert into jezici values (null, 'Romanian', 'Romanian', 0);"));
    //don't forget to change the 151. line!
}

int Baza::dajBrojJezika(){
    QSqlQuery query;

    query.prepare("SELECT COUNT(*) FROM jezici;");

    if (!query.exec())
        qDebug()<<"greska kod dajBrojJezika";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    int br=0;
    if (query.next()){
        br=query.value(0).toInt();
    }

    return br;
}

void Baza::napraviPrimjerBaze(){
    query("insert into grupe values (null, '"+tr("Voće")+"', 0);");
    query("insert into grupe values (null, '"+tr("Mliječni proizvodi")+"', 1);");
    query("insert into grupe values (null, '"+tr("Slatkiši")+"', 2);");
    query("insert into grupe values (null, '"+tr("Pića")+"', 3);");
    query("insert into grupe values (null, '"+tr("Kozmetika")+"', 4);");

    //id, barkod, naziv, idgrupe
    query("insert into artikli values (null, null, '"+tr("Jabuke")+"', 1);");
    query("insert into artikli values (null, null, '"+tr("Kruške")+"', 1);");
    query("insert into artikli values (null, null, '"+tr("Banane")+"', 1);");
    query("insert into artikli values (null, null, '"+tr("Ananas")+"', 1);");

    query("insert into artikli values (null, null, '"+tr("Mlijeko")+"', 2);");
    query("insert into artikli values (null, null, '"+tr("Jogurt")+"', 2);");
    query("insert into artikli values (null, null, '"+tr("Vrhnje")+"', 2);");

    query("insert into artikli values (null, null, '"+tr("Čips")+"', 3);");
    query("insert into artikli values (null, null, '"+tr("Čokolada")+"', 3);");
    query("insert into artikli values (null, null, '"+tr("Bomboni")+"', 3);");
    query("insert into artikli values (null, null, '"+tr("Štapići")+"', 3);");
    query("insert into artikli values (null, null, '"+tr("Krekeri")+"', 3);");

    query("insert into artikli values (null, null, '"+tr("Mineralna voda")+"', 4);");
    query("insert into artikli values (null, null, '"+tr("Gusti sok")+"', 4);");
    query("insert into artikli values (null, null, '"+tr("Pivo")+"', 4);");
    query("insert into artikli values (null, null, '"+tr("Pjenušac")+"', 4);");

    query("insert into artikli values (null, null, '"+tr("Krema za sunčanje")+"', 5);");
    query("insert into artikli values (null, null, '"+tr("Šampon")+"', 5);");
    query("insert into artikli values (null, null, '"+tr("Pasta za zube")+"', 5);");

    query("insert into popisi values (null, '"+tr("Moj prvi popis")+"', 0);");

    query("insert into lista values (null, 1, 1, 1,0,'kom');");
    query("insert into lista values (null, 1, 2, 2,0,'kom');");
    query("insert into lista values (null, 1, 3, 1,0,'kg');");
    query("insert into lista values (null, 1, 4, 1,0,'kom');");
    query("insert into lista values (null, 1, 5, 3,0,'l');");
    query("insert into lista values (null, 1, 6, 3,0,'kom');");
    query("insert into lista values (null, 1, 7, 3,0,'kom');");
    query("insert into lista values (null, 1, 8, 3,0,'kom');");
}

void Baza::dodajPopis(QString imePopisa){
    QSqlQuery query;

    query.prepare("INSERT INTO popisi (id, imePopisa, prioritetPopisa) "\
                  "VALUES (null, :imePopisa, 0);");

    query.bindValue(":imePopisa", imePopisa);

    if (!query.exec())
        qDebug()<<"greska kod dodajPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::preimenujPopis(int idPopisa, QString imePopisa){
    QSqlQuery query;

    query.prepare("UPDATE popisi SET imePopisa=:imePopisa "\
                  "WHERE id=:id;");

    query.bindValue(":imePopisa", imePopisa);
    query.bindValue(":id", idPopisa);

    if (!query.exec())
        qDebug()<<"greska kod preimenujPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::postaviPrioritetPopis(int idPopisa, int prioritetPopisa){
    QSqlQuery query;

    query.prepare("UPDATE popisi SET prioritetPopisa=:prioritetPopisa "\
                  "WHERE id=:id;");

    query.bindValue(":prioritetPopisa", prioritetPopisa);
    query.bindValue(":id", idPopisa);

    if (!query.exec())
        qDebug()<<"greska kod postaviPrioritetPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::brisiPopis(int idPopisa){
    QSqlQuery query;

    query.prepare("DELETE FROM popisi WHERE id=:id;");

    query.bindValue(":id", idPopisa);

    if (!query.exec())
        qDebug()<<"greska kod brisiPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    //brisemo i iz liste
    //"FOREIGN KEY (idPopisa) REFERENCES popisi(id) ON DELETE CASCADE, "

    query.prepare("DELETE FROM lista WHERE idPopisa=:id;");

    query.bindValue(":id", idPopisa);

    if (!query.exec())
        qDebug()<<"greska kod brisiPopis drugi dio";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();


}

void Baza::ispisiPopise(){
    QSqlQuery query("SELECT * FROM popisi ORDER BY prioritetPopisa ASC, imePopisa ASC;");
    QSqlRecord record=query.record();

    qDebug()<<"popisi:";
    while (query.next()){
        qDebug()<<query.value(record.indexOf("id")).toString()<<" "<<query.value(record.indexOf("imePopisa")).toString()<<" "
               <<query.value(record.indexOf("prioritetPopisa")).toString();
    }
}

int Baza::postojiGrupa(QString imeGrupe){
    QSqlQuery query;

    query.prepare("SELECT id FROM grupe WHERE imeGrupe=:imeGrupe;");
    query.bindValue(":imeGrupe", imeGrupe);

    if (!query.exec()){
        qDebug()<<"greska kod postojiGrupa";
        return -1;
    }

    if (query.next()){
        return query.value(0).toInt();
    }

    return -1;
}

void Baza::dodajGrupa(QString imeGrupe){
    QSqlQuery query;

    query.prepare("INSERT INTO grupe (id, imeGrupe, prioritetGrupe) "\
                  "VALUES (null, :imeGrupe, 0);");

    query.bindValue(":imeGrupe", imeGrupe);

    if (!query.exec())
        qDebug()<<"greska kod dodajGrupa";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::preimenujGrupa(int idGrupe, QString imeGrupe){
    QSqlQuery query;

    query.prepare("UPDATE grupe SET imeGrupe=:imeGrupe "\
                  "WHERE id=:id;");

    query.bindValue(":imeGrupe", imeGrupe);
    query.bindValue(":id", idGrupe);

    if (!query.exec())
        qDebug()<<"greska kod preimenujGrupa";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::postaviPrioritetGrupa(int idGrupe, int prioritetGrupe){
    QSqlQuery query;

    query.prepare("UPDATE grupe SET prioritetGrupe=:prioritetGrupe "\
                  "WHERE id=:id;");

    query.bindValue(":prioritetGrupe", prioritetGrupe);
    query.bindValue(":id", idGrupe);

    if (!query.exec())
        qDebug()<<"greska kod postaviPrioritetGrupa";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::brisiGrupa(int idGrupe){
    QSqlQuery query;

    query.prepare("DELETE FROM grupe WHERE id=:id;");

    query.bindValue(":id", idGrupe);

    if (!query.exec())
        qDebug()<<"greska kod brisiGrupa";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();


    //brisi sve aritkle iz grupe (moram rucno jer nemamo foreign keys support)

    //"FOREIGN KEY (idGrupe) REFERENCES grupe(id) ON DELETE CASCADE);"))

    query.prepare("DELETE FROM artikli WHERE idGrupe=:id;");

    query.bindValue(":id", idGrupe);

    if (!query.exec())
        qDebug()<<"greska kod brisiGrupa drugi dio";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

bool Baza::praznaGrupa(int idGrupe){
    QSqlQuery query;

    query.prepare("SELECT count(*) AS broj FROM artikli WHERE idGrupe=:id;");

    query.bindValue(":id", idGrupe);

    if (!query.exec())
        qDebug()<<"greska kod praznaGrupa";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    if (query.next()){
        qDebug()<<query.value(0);

        if (query.value(0)!=0)
            return false;
    }
    return true;
}

bool Baza::prazanPopis(int idPopisa){
    QSqlQuery query;

    query.prepare("SELECT count(*) AS broj FROM lista WHERE idPopisa=:id;");

    query.bindValue(":id", idPopisa);

    if (!query.exec())
        qDebug()<<"greska kod praznaPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    if (query.next()){
        qDebug() <<query.value(0);

        if (query.value(0)!=0)
            return false;
    }
    return true;
}

void Baza::ispisiGrupe(){
    QSqlQuery query("SELECT * FROM grupe ORDER BY prioritetGrupe ASC, imeGrupe ASC;");
    QSqlRecord record=query.record();

    qDebug()<<"grupe";
    while (query.next()){
        qDebug()<<query.value(record.indexOf("id")).toString()<<" "<<query.value(record.indexOf("imeGrupe")).toString()<<" "
               <<query.value(record.indexOf("prioritetGrupe")).toString();
    }
}

void Baza::ispisiArtikle(){
    QSqlQuery query("SELECT * FROM artikli ORDER BY imeArtikla ASC;");
    QSqlRecord record=query.record();

    qDebug()<<"artikli";
    while (query.next()){
        qDebug()<<query.value(record.indexOf("id")).toString()<<" "<<query.value(record.indexOf("barKod")).toString()<<" "
               <<query.value(record.indexOf("imeArtikla")).toString()<<" "<<query.value(record.indexOf("idGrupe")).toString();
    }
}

void Baza::ispisiSveNaPopisima(){
    QSqlQuery query("SELECT * FROM lista;");
    QSqlRecord record=query.record();

    qDebug()<<"popisi";
    while (query.next()){
        qDebug()<<query.value(record.indexOf("id")).toString()<<" "<<query.value(record.indexOf("idPopisa")).toString()<<" "
               <<query.value(record.indexOf("idArtikla")).toString()<<" "<<query.value(record.indexOf("kolicina")).toString()<<" "
              <<query.value(record.indexOf("kupljeno")).toString()<<" "<<query.value(record.indexOf("jedinica")).toString();

    }
}

int Baza::postojiArtiklBazaIme(QString imeArtikla){
    QSqlQuery query;

    query.prepare("SELECT id FROM artikli WHERE imeArtikla=:imeArtikla;");
    query.bindValue(":imeArtikla", imeArtikla);

    if (!query.exec()){
        qDebug()<<"greska kod postojiArtiklBazaIme";
        return -1;
    }
    qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    if (query.next()){
        return query.value(0).toInt();
    }

    return -1;
}

int Baza::postojiArtiklBazaBarkod(QString barKod){
    QSqlQuery query;

    query.prepare("SELECT id FROM artikli WHERE barKod=:barKod;");
    query.bindValue(":barKod", barKod);

    if (!query.exec()){
        qDebug()<<"greska kod postojiArtiklBazaBarKod";
        return -1;
    }
    qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    if (query.next()){
        return query.value(0).toInt();
    }

    return -1;
}

int Baza::postojiArtiklPopisId(int idArtikla, int idPopisa){
    QSqlQuery query;

    query.prepare("SELECT * FROM lista WHERE idPopisa=:id AND idArtikla=:idArtikla;");

    query.bindValue(":idArtikla", idArtikla);
    query.bindValue(":id", idPopisa);

    if (!query.exec()){
        qDebug()<<"greska kod postojiArtiklPopisIme";
        qDebug()<<query.lastError();
        return -1;
    }
    //qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    if (query.next()){
        return query.value(0).toInt();
    }

    return -1;
}

int Baza::postojiArtiklPopisIme(QString imeArtikla, int idPopisa){
    QSqlQuery query;

    query.prepare("SELECT * FROM lista AS l JOIN artikli AS a ON l.idArtikla=a.id "\
                  "WHERE idPopisa=:id AND imeArtikla=:imeArtikla;");

    query.bindValue(":imeArtikla", imeArtikla);
    query.bindValue(":id", idPopisa);

    if (!query.exec()){
        qDebug()<<"greska kod postojiArtiklPopisIme";
        qDebug()<<query.lastError();
        return -1;
    }
    qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    /* QSqlRecord record=query.record();

    qDebug()<<record.fieldName(0)<<" "<<record.fieldName(1)<<" "
            <<record.fieldName(2)<<" "<<record.fieldName(3)<<" "
            <<record.fieldName(4)<<" "<<record.fieldName(5)<<" "
            <<record.fieldName(6)<<" "<<record.fieldName(7)<<" "
            <<record.fieldName(8)<< " "<<record.fieldName(9);
    //test
    while (query.next()){
        qDebug()<<query.value(0).toString()<<" "<<query.value(1).toString()<<" "
                <<query.value(2).toString()<<" "<<query.value(3).toString()<<" "
                <<query.value(4).toString()<<" "<<query.value(5).toString()<<" "
                <<query.value(6).toString()<< " "<<query.value(7).toString()<<" "
                <<query.value(8).toString()<< " "<<query.value(9).toString();
    }
    */
    if (query.next()){
        return query.value(0).toInt();
    }

    return -1;
}

int Baza::postojiArtiklPopisBarkod(QString barKod, int idPopisa){
    QSqlQuery query;

    query.prepare("SELECT * FROM lista AS l JOIN artikli AS a ON l.idArtikla=a.id "\
                  "WHERE idPopisa=:id AND barKod=:barKod;");

    query.bindValue(":barKod", barKod);
    query.bindValue(":id", idPopisa);

    if (!query.exec()){
        qDebug()<<"greska kod postojiArtiklPopisBarKod";
        qDebug()<<query.lastError();
        return -1;
    }
    qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    if (query.next()){
        return query.value(0).toInt();
    }

    return -1;
}

bool Baza::postojiGrupaSviPopisi(int idGrupe){
    QSqlQuery query;

    query.prepare("SELECT * FROM lista AS l JOIN artikli AS a ON l.idArtikla=a.id "\
                  "WHERE idGrupe=:id;");

    query.bindValue(":id", idGrupe);

    if (!query.exec()){
        qDebug()<<"greska kod postojiGrupaSviPopisi";
        qDebug()<<query.lastError();
        return false;
    }
    qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    if (query.next()){
        return true;
    }

    return false;
}

bool Baza::postojiArtiklSviPopisi(int idArtikla){
    QSqlQuery query;

    query.prepare("SELECT * FROM lista WHERE idArtikla=:id;");

    query.bindValue(":id", idArtikla);

    if (!query.exec()){
        qDebug()<<"greska kod postojiArtiklSviPopisi";
        qDebug()<<query.lastError();
        return false;
    }
    qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    if (query.next()){
        return true;
    }

    return false;
}

void Baza::dodajArtiklBaza(QString imeArtikla, int idGrupe, QString barkod){
    QSqlQuery query;

    query.prepare("INSERT INTO artikli (id, barKod, imeArtikla, idGrupe) VALUES "\
                  "(null, :barKod, :imeArtikla, :idGrupe);");

    query.bindValue(":barKod", barkod);
    query.bindValue(":imeArtikla", imeArtikla);
    query.bindValue(":idGrupe", idGrupe);

    if (!query.exec())
        qDebug()<<"greska kod dodajArtiklBaza";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::dodajArtiklPopis(int idArtikla, int idPopisa, float kolicina, QString mjernaJedinica){
    QSqlQuery query;

    query.prepare("INSERT INTO lista (id, idPopisa, idArtikla, kolicina, kupljeno, jedinica) VALUES "\
                  "(null, :idPopisa, :idArtikla, :kolicina, 0, :jedinica);");

    query.bindValue(":idPopis", idPopisa);
    query.bindValue(":idArtikla", idArtikla);
    query.bindValue(":kolicina", kolicina);
    query.bindValue(":jedinica", mjernaJedinica);


    if (!query.exec())
        qDebug()<<"greska kod dodajArtiklPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::preimenujArtikl(int idArtikla, QString imeArtikla){
    QSqlQuery query;

    query.prepare("UPDATE artikli SET imeArtikla=:imeArtikla "\
                  "WHERE id=:id;");

    query.bindValue(":imeArtikla", imeArtikla);
    query.bindValue(":id", idArtikla);

    if (!query.exec())
        qDebug()<<"greska kod preimenujArtikl";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}


void Baza::brisiArtiklBaza(int idArtikla){
    QSqlQuery query;

    query.prepare("DELETE FROM artikli WHERE id=:id;");

    query.bindValue(":id", idArtikla);

    if (!query.exec())
        qDebug()<<"greska kod brisiArtiklBaza";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    query.prepare("DELETE FROM lista WHERE idArtikla=:id;");

    query.bindValue(":id", idArtikla);

    if (!query.exec())
        qDebug()<<"greska kod brisiArtiklBaza drugi dio";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}



void Baza::brisiArtiklPopis(int idArtikla, int idPopisa){
    QSqlQuery query;

    query.prepare("DELETE FROM lista WHERE idPopisa=:idPopisa AND idArtikla=:idArtikla;");

    query.bindValue(":idPopisa", idPopisa);
    query.bindValue(":idArtikla", idArtikla);

    if (!query.exec())
        qDebug()<<"greska kod brisiArtiklPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::izmjenaArtiklPopis(int idArtikla, int idPopisa, float kolicina, QString mjernaJedinica){
    QSqlQuery query;

    query.prepare("UPDATE lista SET kolicina=:kolicina, jedinica=:mjernaJedinica "\
                  "WHERE idPopisa=:idPopisa AND idArtikla=:idArtikla;");

    query.bindValue(":idPopisa", idPopisa);
    query.bindValue(":idArtikla", idArtikla);
    query.bindValue(":kolicina", kolicina);
    query.bindValue(":mjernaJedinica", mjernaJedinica);

    if (!query.exec())
        qDebug()<<"greska kod izmjenaArtiklPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::prebaciArtiklBaza(int idArtikla, int idGrupe){
    QSqlQuery query;

    query.prepare("UPDATE artikli SET idGrupe=:idGrupe "\
                  "WHERE id=:idArtikla;");

    query.bindValue(":idGrupe", idGrupe);
    query.bindValue(":idArtikla", idArtikla);

    if (!query.exec()){
        qDebug()<<"greska kod prebaciArtiklBaza";
        qDebug()<<query.lastError();
    }
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::prebaciGrupe(int idIzGrupe, int idUGrupu){
    QSqlQuery query;

    query.prepare("UPDATE artikli SET idGrupe=:idUGrupu "\
                  "WHERE idGrupe=:idIzGrupe;");

    query.bindValue(":idUGrupu", idUGrupu);
    query.bindValue(":idIzGrupe", idIzGrupe);

    if (!query.exec())
        qDebug()<<"greska kod prebaciGrupe";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

void Baza::postaviKupljenArtiklPopis(int idArtikla, int idPopisa, bool kupljen){
    QSqlQuery query;


    qDebug()<<"javljam iz baze da je pozvan postavi kupljen artikl popis s idartikla"<<idArtikla<<" id popisa"<<idPopisa<<"kupljen:"<<kupljen;


    query.prepare("UPDATE lista SET kupljeno=:kupljeno "\
                  "WHERE idPopisa=:idPopisa AND idArtikla=:idArtikla;");

    int kupljeno=(kupljen)?1:0;

    query.bindValue(":idPopisa", idPopisa);
    query.bindValue(":idArtikla", idArtikla);
    query.bindValue(":kupljeno", kupljeno);

    if (!query.exec())
        qDebug()<<"greska kod kupljenArtiklPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

/*void Baza::postaviKupljenPopis(int idPopisa, bool kupljen){
    QSqlQuery query;

    query.prepare("UPDATE popisi SET kupljeno=:kupljeno "\
                  "WHERE id=:idPopisa;");

    int kupljeno=(kupljen)?1:0;

    query.bindValue(":idPopisa", idPopisa);
    query.bindValue(":kupljeno", kupljeno);

    if (!query.exec())
        qDebug()<<"greska kod kupljenPopis";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}*/

bool Baza::kupljenCijeliPopis(int idPopisa){
    QSqlQuery query;

    query.prepare("SELECT * FROM lista WHERE idPopisa=:id;");

    query.bindValue(":id", idPopisa);

    if (!query.exec()){
        qDebug()<<"greska kod kupljenCijeliPopis";
        qDebug()<<query.lastError();
        return false;
    }
    qDebug()<<"uspjesno izvrseno "<<query.lastQuery();

    QSqlRecord record=query.record();

    /* qDebug()<<record.fieldName(0)<<" "<<record.fieldName(1)<<" "
            <<record.fieldName(2)<<" "<<record.fieldName(3)<<" "
            <<record.fieldName(4)<<" "<<record.fieldName(5);*/

    while (query.next()){
        qDebug()<<query.value(record.indexOf("kupljeno")).toInt();
        if (query.value(record.indexOf("kupljeno")).toInt()==0)
            return false;
    }

    return true;
}

std::vector<Artikl> Baza::dajSveArtikle(){
    QSqlQuery query("SELECT * FROM artikli AS a JOIN grupe AS g ON a.idGrupe=g.id ORDER BY g.prioritetGrupe ASC, a.imeArtikla ASC;");

    QSqlRecord record=query.record();

    std::vector<Artikl> artikli;

    while (query.next()){

        artikli.push_back(Artikl(query.value(record.indexOf("id")).toInt(),
                                 query.value(record.indexOf("barKod")).toString(),
                                 query.value(record.indexOf("imeArtikla")).toString(),
                                 Grupa(query.value(record.indexOf("idGrupe")).toInt(),
                                       query.value(record.indexOf("imeGrupe")).toString(),
                                       query.value(record.indexOf("prioritetGrupe")).toInt()
                                       )
                                 ));

        //qDebug()<<query.value(record.indexOf("id")).toString()<<" "<<query.value(record.indexOf("barKod")).toString()<<" "
        //         <<query.value(record.indexOf("imeArtikla")).toString()<<" "<<query.value(record.indexOf("idGrupe")).toString();
    }

    return artikli;
}

std::vector<Grupa> Baza::dajSveGrupe(){
    QSqlQuery query("SELECT * FROM grupe ORDER BY prioritetGrupe ASC;");

    std::vector<Grupa> grupe;

    QSqlRecord record=query.record();

    while (query.next()){
        grupe.push_back(Grupa(query.value(record.indexOf("id")).toInt(),
                              query.value(record.indexOf("imeGrupe")).toString(),
                              query.value(record.indexOf("prioritetGrupe")).toInt()
                              ));
    }

    return grupe;
}

std::vector<Popis> Baza::dajSvePopise(){
    QSqlQuery query("SELECT * FROM popisi ORDER BY prioritetPopisa ASC;");

    std::vector<Popis> popisi;

    QSqlRecord record=query.record();

    while (query.next()){
        popisi.push_back(Popis(query.value(record.indexOf("id")).toInt(),
                               query.value(record.indexOf("imePopisa")).toString(),
                               query.value(record.indexOf("prioritetPopisa")).toInt()
                               ));
    }

    qDebug()<<"zvano daj sve popise...";
    return popisi;
}

std::vector<Jezik> Baza::dajSveJezike(){

    QSqlQuery query2("SELECT * FROM jezici ORDER BY imeJezika ASC;");
    QSqlRecord record2=query2.record();

    qDebug()<<"jezici:";
    while (query2.next()){
        qDebug()<<query2.value(record2.indexOf("id")).toString()<<" "<<query2.value(record2.indexOf("imeJezika")).toString()<<" "
               <<query2.value(record2.indexOf("sifraJezika")).toString()<<" "<<query2.value(record2.indexOf("odabrano")).toInt();
    }



    QSqlQuery query("SELECT * FROM jezici ORDER BY imeJezika ASC;");

    std::vector<Jezik> jezici;

    QSqlRecord record=query.record();

    while (query.next()){
        jezici.push_back(Jezik(query.value(record.indexOf("id")).toInt(),
                               query.value(record.indexOf("imeJezika")).toString(),
                               query.value(record.indexOf("sifraJezika")).toString(),
                               (query.value(record.indexOf("odabrano")).toInt()==1)?true:false
                                                                                    ));
    }

    qDebug()<<"zvano daj sve jezike...";
    return jezici;
}

Jezik Baza::dajOdabraniJezik(){
    QSqlQuery query("SELECT * FROM jezici WHERE odabrano=1;");

    QSqlRecord record=query.record();

    query.next();

    return Jezik(query.value(record.indexOf("id")).toInt(),
                 query.value(record.indexOf("imeJezika")).toString(),
                 query.value(record.indexOf("sifraJezika")).toString(),
                 (query.value(record.indexOf("odabrano")).toInt()==1)?true:false
                                                                      );
}

void Baza::odaberiJezik(int idJezika){

    //onaj koji je trenutno stavi na 0
    //onaj koji je oznaceni stavi na 1
    QSqlQuery query;

    query.prepare("UPDATE jezici SET odabrano=0 WHERE odabrano=1;");

    if (!query.exec())
        qDebug()<<"greska kod mijenjanja jezika";

    query.prepare("UPDATE jezici SET odabrano=1 WHERE id=:idJezika;");

    query.bindValue(":idJezika", idJezika);

    if (!query.exec())
        qDebug()<<"greska kod odaberiJezik";
    else
        qDebug()<<"uspjesno izvrseno "<<query.lastQuery();
}

std::vector<ElementPopisa> Baza::dajSveElementePopisa(int idPopisa){
    QSqlQuery query;
    query.prepare("SELECT * FROM lista AS l JOIN artikli AS a ON l.idArtikla=a.id "\
                  "JOIN grupe AS g ON a.idGrupe=g.id "\
                  "WHERE l.idPopisa=:idPopisa ORDER BY g.prioritetGrupe ASC, a.imeArtikla ASC;");

    query.bindValue(":idPopisa", idPopisa);

    query.exec();

    std::vector<ElementPopisa> popis;

    QSqlRecord record=query.record();

    while (query.next()){
        popis.push_back(ElementPopisa(query.value(record.indexOf("id")).toInt(),
                                      Artikl(query.value(record.indexOf("idArtikla")).toInt(),
                                             query.value(record.indexOf("barKod")).toString(),
                                             query.value(record.indexOf("imeArtikla")).toString(),
                                             Grupa(query.value(record.indexOf("idGrupe")).toInt(),
                                                   query.value(record.indexOf("imeGrupe")).toString(),
                                                   query.value(record.indexOf("prioritetGrupe")).toInt()
                                                   )
                                             ),
                                      query.value(record.indexOf("kolicina")).toFloat(),
                                      (query.value(record.indexOf("kupljeno")).toInt()==1)?true:false,
                                      query.value(record.indexOf("jedinica")).toString()
                                      ));
    }

    return popis;
}
